package com.nebula.salary.portal.service;

import com.nebula.salary.common.result.ServerResponse;
import com.nebula.salary.model.dto.RoleDto;
import com.nebula.salary.model.dto.RoleQueryDto;
import com.nebula.salary.model.pojo.Role;

import java.util.List;
import java.util.Map;

import com.baomidou.mybatisplus.extension.service.IService;
import com.nebula.salary.model.vo.PageResult;
import com.nebula.salary.model.vo.RoleVo;

/**
 * <p>
 * 角色表 服务类
 * </p>
 *
 * @author codex
 * @since 2022-01-24
 */
public interface IRoleService extends IService<Role> {
    
    /**
     * 获取有权管理的角色列表
     *
     * @param page     当前页码
     * @param pageSize 每页条数
     * @param role     查询条件
     * @return 角色列表
     */
    ServerResponse<PageResult> getRolesByPage(Long page, Long pageSize, RoleQueryDto role);
    
    /**
     * 新增角色
     *
     * @param roleDto 角色数据传输类
     * @return 新增结果
     */
    ServerResponse<String> add(RoleDto roleDto);
    
    /**
     * 验证数据输入的正确性
     *
     * @param roleDto 角色数据传输类
     */
    void checkData(RoleDto roleDto);
    
    /**
     * 校验角色名称是否唯一
     *
     * @param roleDto 角色信息
     * @return 结果
     */
    String checkRoleNameUnique(RoleDto roleDto);
    
    /**
     * 校验角色权限是否唯一
     *
     * @param roleDto 角色信息
     * @return 结果
     */
    String checkRoleSecurityUnique(RoleDto roleDto);
    
    /**
     * 校验当前用户角色是否有数据权限
     *
     * @param roleId 角色ID
     */
    void checkRoleDataScope(Integer roleId);
    
    /**
     * 根据用户ID获取角色信息
     *
     * @param userId 用户ID
     * @return 角色信息
     */
    Role getRolesByUserId(Long userId);
    
    /**
     * 修改角色
     *
     * @param roleDto 角色信息
     * @return 修改结果
     */
    int updateRole(RoleDto roleDto);
    
    /**
     * 批量删除
     *
     * @param roleIds 角色ID数组
     * @return 结果
     */
    ServerResponse<String> deleteRoles(Integer[] roleIds);
    
    /**
     * 校验角色等级是否超过当前用户所拥有的的等级
     *
     * @param roleDto 角色信息
     * @return 结果
     */
    String checkRoleLevelAllowed(RoleDto roleDto);
    
    /**
     * 获取有权的所有角色列表
     *
     * @param role 角色信息
     * @return 角色列表
     */
    List<RoleVo> getPerAllList(RoleQueryDto role);
    
    /**
     * 修改角色菜单权限
     *
     * @param roleDto 角色和菜单信息
     * @return 结果
     */
    int updateRoleNavigation(RoleDto roleDto);
}
